package uni.edu.pe.analisisSentimental.web.listener;

import static uni.edu.pe.analisisSentimental.common.Constantes.PATH_DICCIONARIO;
import static uni.edu.pe.analisisSentimental.common.Constantes.PATH_URL_FILTRAR;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_DICCIONARIO_AGREGAR;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_DICCIONARIO_ESPANIOL;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_MAP_JERGAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_MAP_PISTAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_PISTAS_NEGATIVAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_PISTAS_POSITIVAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.VARIABLE_CONTEXTO_URL_FILTRAR;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import uni.edu.pe.analisisSentimental.domain.PistaSubjetividad;
import uni.edu.pe.analisisSentimental.service.TweetManagerService;
import uni.edu.pe.analisisSentimental.service.common.Utilitario;

public class AnalisisSentimentalContextListener implements ServletContextListener{
	
	private static Logger logger = LoggerFactory.getLogger(AnalisisSentimentalContextListener.class);
	
	private TweetManagerService tweetManagerService;
	
	public void contextInitialized(ServletContextEvent sce) {
		logger.debug("<==== Inicio: Method contextInitialized ====>");
		
		final boolean isTraceEnabled = logger.isTraceEnabled();
    	
        ServletContext servletContext = sce.getServletContext();

        WebApplicationContext webApplicationContext = WebApplicationContextUtils
                .getWebApplicationContext(servletContext);
        if (isTraceEnabled)
        {
            logger.trace("webApplicationContext: {}"+webApplicationContext);
        }

        tweetManagerService = webApplicationContext.getBean("tweetManagerService", TweetManagerService.class);
        if(isTraceEnabled){
            logger.trace("tweetManagerService: {}"+tweetManagerService);
        }
        
        //Map de Jergas de Internet
        Map<String, String> mapJerga = tweetManagerService.obtenerJergasInternetTest();
		logger.debug("mapJerga: " + mapJerga.size());
        servletContext.setAttribute(VARIABLE_CONTEXTO_MAP_JERGAS, mapJerga);

        //Map de Pistas de Subjetividad
        Map<String, PistaSubjetividad> mapPista = tweetManagerService.obtenerPistasSubjetividad();
		logger.debug("mapPista: " + mapPista.size());
        servletContext.setAttribute(VARIABLE_CONTEXTO_MAP_PISTAS, mapPista);
        
        List<String> lstfuerteNegativa = new ArrayList<String>();
        List<String> lstFuertePositiva = new ArrayList<String>();
        
        List<PistaSubjetividad> lstPistaTotales = new ArrayList<PistaSubjetividad>(mapPista.values());
        Utilitario.obtenerPistaSubjetividadFuertementeSubjetivas(lstPistaTotales,lstfuerteNegativa,lstFuertePositiva );
        servletContext.setAttribute(VARIABLE_CONTEXTO_PISTAS_NEGATIVAS, lstfuerteNegativa);
        servletContext.setAttribute(VARIABLE_CONTEXTO_PISTAS_POSITIVAS, lstFuertePositiva);
        //Set del diccionario de palabras en castellano
        Set<String> setDiccionario = obtenerDiccionarioEspaniol(webApplicationContext);        
        if(logger.isDebugEnabled()){
        	if(CollectionUtils.isNotEmpty(setDiccionario)){
        		logger.debug("setDiccionario.size: ()"+setDiccionario.size());
        	}
        }
        Set<String> setUrlFiltrar = obtenerUrlsAFiltrar(webApplicationContext);        
        if(logger.isDebugEnabled()){
        	if(CollectionUtils.isNotEmpty(setUrlFiltrar)){
        		logger.debug("setDiccionario.size: ()"+setUrlFiltrar.size());
        	}
        }
        Set<String> setDiccAgregar = new HashSet<String>(); 
        servletContext.setAttribute(VARIABLE_CONTEXTO_DICCIONARIO_ESPANIOL, setUrlFiltrar);
        servletContext.setAttribute(VARIABLE_CONTEXTO_URL_FILTRAR, setUrlFiltrar);
        servletContext.setAttribute(VARIABLE_CONTEXTO_DICCIONARIO_AGREGAR, setDiccAgregar);
        
     }
	private Set<String> obtenerDiccionarioEspaniol(
			WebApplicationContext webApplicationContext) {
		logger.debug("<==== Inicio Method obtenerDiccionarioEspaniol ====>");
		Set<String> set = new HashSet<String>();
		Resource resource =  webApplicationContext.getResource(PATH_DICCIONARIO);		
        return Utilitario.obtenerTextoDeFileEnSet(set, resource);
	}

	private Set<String> obtenerUrlsAFiltrar(
			WebApplicationContext webApplicationContext) {
		logger.debug("<==== Inicio Method obtenerUrlsAFiltrar ====>");
		Set<String> set = new HashSet<String>();
		Resource resource =  webApplicationContext.getResource(PATH_URL_FILTRAR);		
        return Utilitario.obtenerTextoDeFileEnSet(set, resource);
	}
	

	public void contextDestroyed(ServletContextEvent sce) {
		logger.debug("<==== Inicio: Method contextDestroyed ====>");		
		final boolean isTraceEnabled = logger.isTraceEnabled();    	
        ServletContext servletContext = sce.getServletContext();
        WebApplicationContext webApplicationContext = WebApplicationContextUtils
                .getWebApplicationContext(servletContext);
        if (isTraceEnabled)
        {
            logger.trace("webApplicationContext: {}"+webApplicationContext);
        }          
		
	}

}
